# -*- coding: utf-8 -*-
# created by Alberthch - 陈航  2021/7/15 15:15
# Description:在迭代操作的时候，怎样只保留最后有限几个元素的历史记录？

from collections import deque


# 可以找到所有带有关键字行的前5行
def search(lines, pattern, history):
    # 双向字典deque
    # 生成固定大小的双向队列
    previous_lines = deque(maxlen=history)
    for line in lines:
        # 进行匹配
        # 一旦碰到yield语句就退出函数
        if pattern in line:
            # 把一个函数改写为一个 generator 就获得了迭代能力，比起用类的实例保存状态来计算下一个 next() 的值，不仅代码简洁，而且执行流程异常清晰。
            # 当需要使用list保存数据时候，可以考虑改成yield表达式，使得函数变成一个可迭代对象
            # 带yield的函数是一个生成器，而不是一个函数了，这个生成器有一个函数就是next函数，next就相当于“下一步”生成哪个数，
            # 这一次的next开始的地方是接着上一次的next停止的地方执行的，
            yield line, previous_lines
        previous_lines.append(line)


# Example use on a file
if __name__ == '__main__':
    with open('1.3_keeping_the_last_n_items/somefile.txt') as f:
        for line, prevlines in search(f, 'python', 5):
            # print(len(prevlines))
            for pline in prevlines:
                print(pline, end='')
            print(line, end='')
            print('-' * 20)

